Premier bloc de code : importation des librairies.
library(dplyr)
library(ggplot2)
library(tidytext)
library(knitr)
library(SnowballC)
library(grid)
# WARNING : some libraries are not used but kept here at hand if the code were
# to be modified back (those libraries were used in
# previous versions of the script).
data("stop_words")
custom_stop_words <- tibble(word = c("plot","wild","slug","manipulation",
"apple","significant",
"significative","signific","free","led",
"lead","warm","fresh","like"),
lexicon = c("custom")) # remove words
#that does not have the same connotation in science compared to common language.
combined_stop_words <- bind_rows(stop_words, custom_stop_words) # didn't find
#the way to combine tibbles earlier, which is why some code chunks work with
#the two "stop words" dictionnaries separetly.
Deuxième bloc de code : définition des variables.
#-----------------------------
earthworms <- read.csv(file.path("~", "Documents", "GitHub",
"EarthwormsMetanalysis",
"ExtractionBiblio",
"data_articles_metaanalyses.csv"))
abstracts<-c()
#---------------------
names(earthworms)
## [1] "X" "MA" "Title" "First.author"
## [5] "Last.author" "Abstract" "OnResearchgate" "DOI"
## [9] "rg_URL" "X." "X.1" "X.2"
n = nrow(earthworms)
Troisième bloc de code: ajout d’une colonne “aboutEarthworms”.
earthworms <- earthworms %>% mutate(aboutEarthworms = rep(TRUE,n))
Quatrième bloc de code: Construction de la liste des abstracts.
abstracts=earthworms$Abstract
Cinquième bloc de code : Construction d’un dataframe de tokens.
# Unnest tokens for the current abstract
unnested_tokens <- tibble(abstracts) %>%
unnest_tokens(word, abstracts)
# Append the unnested tokens to the list
unnested_tokens<-unnested_tokens%>%anti_join(stop_words)
unnested_tokens<-unnested_tokens %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
Analyse du dataframe: trouver les mots les plus communs dans les quatre MA confondues.
ordre=unnested_tokens %>%
count(word, sort = TRUE) %>%
filter(n > 100) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
ordre$word = factor(ordre$word,levels=rev(levels(ordre$word)))
ggplot(ordre,aes(n, word)) +
geom_col() +
labs(y = NULL)
On peut voir que les trois mots les plus fréquents dans les
articles des quatres métaanalyses confondues sont earthworm,
soil et plant. On peut donc penser que les
métaanalyses sont davantage portées sur le rôle écologique du ver de
terre que sur l’étude des vers de terre à part entière.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
splitedData <- split(earthworms,earthworms$MA)
abstracts1<-c()
MA1 <- splitedData$MA1
nMA1 <- nrow(MA1)
abstracts1<-MA1$Abstract
unnested_tokens1 <- tibble(abstracts1) %>%
unnest_tokens(word, abstracts1)
unnested_tokens1<-unnested_tokens1 %>% anti_join(stop_words)
unnested_tokens1<-unnested_tokens1 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
abstracts2<-c()
MA2 <- splitedData$MA2
nMA2 <- nrow(MA2)
abstracts2<-MA2$Abstract
unnested_tokens2 <- tibble(abstracts2) %>%
unnest_tokens(word, abstracts2)
unnested_tokens2<-unnested_tokens2 %>% anti_join(stop_words)
unnested_tokens2<-unnested_tokens2 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
abstracts3<-c()
MA3 <- splitedData$MA3
nMA3 <- nrow(MA3)
abstracts3<-MA3$Abstract
unnested_tokens3 <- tibble(abstracts3) %>%
unnest_tokens(word, abstracts3)
unnested_tokens3<-unnested_tokens3 %>% anti_join(stop_words)
unnested_tokens3<-unnested_tokens3 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
abstracts4<-c()
MA4 <- splitedData$MA4
nMA4 <- nrow(MA4)
abstracts4<-MA4$Abstract
unnested_tokens4 <- tibble(abstracts4) %>%
unnest_tokens(word, abstracts4)
unnested_tokens4<-unnested_tokens4 %>% anti_join(stop_words)
unnested_tokens4<-unnested_tokens4 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
ordre1=unnested_tokens1 %>%
count(word, sort = TRUE) %>%
filter(n > 25) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
ordre1$word = factor(ordre1$word,levels=rev(levels(ordre1$word)))
plot1<-ggplot(ordre1,aes(n, word)) +
geom_col() +
labs(y = NULL)
ordre2=unnested_tokens2 %>%
count(word, sort = TRUE) %>%
filter(n > 25) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
ordre2$word = factor(ordre2$word,levels=rev(levels(ordre2$word)))
plot2<-ggplot(ordre2,aes(n, word)) +
geom_col() +
labs(y = NULL)
ordre3=unnested_tokens3 %>%
count(word, sort = TRUE) %>%
filter(n > 25) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
ordre3$word = factor(ordre3$word,levels=rev(levels(ordre3$word)))
plot3<-ggplot(ordre3,aes(n, word)) +
geom_col() +
labs(y = NULL)
ordre4=unnested_tokens4 %>%
count(word, sort = TRUE) %>%
filter(n > 25) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
ordre4$word = factor(ordre4$word,levels=rev(levels(ordre4$word)))
plot4<-ggplot(ordre4,aes(n, word)) +
geom_col() +
labs(y = NULL)
Quels sont les mots les plus communs dans chacunes des MA?
library(egg)
ggarrange(plot1,plot2,plot3,plot4,widths = c(5,5),labels = c("1","2","3","4"))
On remarque que les mots les plus fréquents dans les articles des
métaanalyses sont: - earthworm, soil et
forest pour la MA1 (qui semble donc s’intéresser plus
particulièrement à l’écosystème forestier). - plant,
earthworm et increase pour la MA2 (qui semble donc
vouloir étudier précisément les effets des vers de terre sur les
plantes). - earthworm, specie, et plant pour
la MA3 (qui semble donc s’intéresser plus particulièrement à certaines
espèces de vers de terre et leurs relations avec les plantes). -
earthworm, plant et soil pour la MA4 (qui
semble donc étudier l’influence des vers de terre sur les sols et les
plantes).
MA1: “Soil chemistry turned upside down: a
meta-analysis of invasive earthworm effects on soil chemical
properties”
MA2: “Earthworms affect plant growth and resistance
against herbivores: A meta-analysis”
MA3: “The unseen invaders:
introduced earthworms as drivers of change in plant communities in North
American forests (a meta-analysis)”
MA4: “Earthworms increase plant
production: a meta-analysis”
# DataFrame pour comparer les
fréquences des 4 MA:
library(tidyr)
frequency1 <- bind_rows(mutate(unnested_tokens1, author = "MA1"),
mutate(unnested_tokens2, author = "MA2"),
mutate(unnested_tokens3, author = "MA3"),
mutate(unnested_tokens4, author = "MA4"))%>%
mutate(word = stringr::str_extract(word, "[a-z']+")) %>%
count(author, word) %>%
group_by(author) %>%
mutate(proportion = n / sum(n)) %>%
select(-n) %>%
pivot_wider(names_from = author, values_from = proportion) %>%
pivot_longer(cols=c('MA2','MA3','MA4'),
names_to = "author", values_to = "proportion")
frequency2 <- bind_rows(mutate(unnested_tokens1, author = "MA1"),
mutate(unnested_tokens2, author = "MA2"),
mutate(unnested_tokens3, author = "MA3"),
mutate(unnested_tokens4, author = "MA4"))%>%
mutate(word = stringr::str_extract(word, "[a-z']+")) %>%
count(author, word) %>%
group_by(author) %>%
mutate(proportion = n / sum(n)) %>%
select(-n) %>%
pivot_wider(names_from = author, values_from = proportion) %>%
pivot_longer(cols=c('MA1','MA3','MA4'),
names_to = "author", values_to = "proportion")
frequency3 <- bind_rows(mutate(unnested_tokens1, author = "MA1"),
mutate(unnested_tokens2, author = "MA2"),
mutate(unnested_tokens3, author = "MA3"),
mutate(unnested_tokens4, author = "MA4")) %>%
mutate(word = stringr::str_extract(word, "[a-z']+")) %>%
count(author, word) %>%
group_by(author) %>%
mutate(proportion = n / sum(n)) %>%
select(-n) %>%
pivot_wider(names_from = author, values_from = proportion) %>%
pivot_longer(cols=c('MA1','MA2','MA4'),
names_to = "author", values_to = "proportion")
library(scales)
# expect a warning about rows with missing values being removed
ggplot(frequency1, aes(x = proportion, y = `MA1`,
color = abs(`MA1` - proportion))) +
geom_abline(color = "gray40", lty = 2) +
geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
scale_x_log10(labels = percent_format()) +
scale_y_log10(labels = percent_format()) +
scale_color_gradient(limits = c(0, 0.001),
low = "darkslategray4", high = "gray75") +
facet_wrap(~author, ncol = 2) +
theme(legend.position="none") +
labs(y = "MA1", x = NULL)
Les mots proches de la ligne dans ces graphiques ont des fréquences similaires dans les deux ensembles de textes, soit, dans l’ordre croissant: “accelerated”, “affecting”,“based”, “dweling”, “day”, “change”, “common”, “availability”, “negative”, “abundance”, “content”, “increase”, “activity”, “concentration”, “litter”, “biomass”, “specie”, “soil”, “earthworm”. On remarque que les mots les plus fréquents semblent être plus directement liés au sujet de l’article que les autres, qui paraissent plus générique au vocabulaire scientifique en écologie.
Les mots “invasion”, “carbon”, “layer” et “loss” sont plus fréquents dans la MA1 que dans la MA2, tandis que les mots “plant”, “root”, “shoot” et “grass” sont plus fréquents dans la MA2 que de la MA1.
Les mots “specie”, “effect”, “soil” et “earthworm” représentent entre 1 et 10% des mots totaux de chaque métaanalyse pour les métaanalyses 1 et 2 (échelle logarithmique).
Les mots proches de la ligne dans ces graphiques ont des fréquences similaires dans les deux ensembles de textes, soit, dans l’ordre croissant: “assessed”, “basal”, “abundant”, “abiotic”, “day”, “biotic”, “avalability”, “compared”, “america”, “invasive”, “european”, “abundance”, “study”, “nutrient”, “increased”, “exotic”, “ecosystem”, “impact”, “litter”, “biomass”, “effect”, “invasion”, “forest”, “specie”, “soil”, “earthworm”. On remarque que certains mots dont la fréquence est proches pourraient peut-être faire partie du même groupe de mots (comme “invasive european”,“nutrient increased”, “ecosystem impact” ou encore “litter biomass”.)
Les mots “pool”, “carbon”, et “microbial sont plus fréquents dans la MA1 que dans la MA3, tandis que les mots “cover”, “tree”, “density” et “plant” sont plus fréquents dans la MA3 que de la MA1.
Les mots “specie”, “forest,”soil” et “earthworm” représentent entre 1 et 10% des mots totaux de chaque métaanalyse pour les métaanalyses 1 et 3 (échelle logarithmique). On peut remarquer une forte ressemblance avec les résultats obtenus entre les MA 1 et 2.
Les mots proches de la ligne dans ces graphiques ont des fréquences similaires dans les deux ensembles de textes, soit, dans l’ordre croissant: “access”,“acquisition”,“data”,“australia”, “amonium”, “applied”, “analysis”, “due”, “mass”, “direct”, “affect”, “system”, “native”, “ecosystem”, “density”, “experiment”, “organic”, “activity”, “litter”, “community”, “biomass”, “specie”, effect, earthworm. On remarque que certains mots dont la fréquence est proches pourraient peut-être faire partie du même groupe de mots (comme acquisition data, direct effect, native ecosystem, ou encore litter community).
Les mots “forest”,“invasion”, “carbon” et “floor” sont plus fréquents dans la MA1 que dans la MA4, tandis que les mots “invader”, “functional”, “grassland”, “grass” et “plant” sont plus fréquents dans la MA4 que de la MA1.
Les mots “effect” et “earthworm” représentent entre 1 et 10% des mots totaux de chaque métaanalyse pour les métaanalyses 1 et 4 (échelle logarithmique).
Dans cette configuration, la MA1 et la MA4 semblent être les plus similaires en termes de fréquences de mots (nuage de points davantage resserré autour de la droite.)
Dans cette configuration, la MA1 et la MA2 semblent être les moins similaires en termes de fréquences de mots (nuage de points davantage dispersé autour de la droite.)
Quel est le degré de corrélation entre les fréquences de mots de chaque métaanalyse ?
cor.test(data = frequency1[frequency1$author == "MA2",],
~ proportion + `MA1`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA1
## t = 16.521, df = 337, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6055880 0.7238922
## sample estimates:
## cor
## 0.6689551
cor.test(data = frequency1[frequency1$author == "MA3",],
~ proportion + `MA1`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA1
## t = 25.413, df = 369, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7574403 0.8319765
## sample estimates:
## cor
## 0.7977354
cor.test(data = frequency1[frequency1$author == "MA4",],
~ proportion + `MA1`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA1
## t = 28.579, df = 562, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7337336 0.8013119
## sample estimates:
## cor
## 0.7696699
cor.test(data = frequency2[frequency2$author == "MA3",],
~ proportion + `MA2`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA2
## t = 18.2, df = 224, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7138335 0.8202087
## sample estimates:
## cor
## 0.7723822
cor.test(data = frequency2[frequency2$author == "MA4",],
~ proportion + `MA2`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA2
## t = 31.618, df = 467, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7944275 0.8524116
## sample estimates:
## cor
## 0.8255868
cor.test(data = frequency3[frequency3$author == "MA4",],
~ proportion + `MA3`)
##
## Pearson's product-moment correlation
##
## data: proportion and MA3
## t = 18.105, df = 306, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6604871 0.7691044
## sample estimates:
## cor
## 0.7191607
| MA1 | MA2 | MA3 | MA4 | |
|---|---|---|---|---|
| MA1 | - | 0.671 | 0.799 | 0.779 |
| MA2 | - | 0.793 | 0.825 | |
| MA3 | - | 0.740 | ||
| MA4 | - |
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
D’après le tableau ci-dessus, on peut voir que le choix de mots est le plus corrélé (correlation de Pearson) entre la MA2 et la MA4 (r²=0.825), tandis que le choix de mots est le moins corrélé (corrélation de Pearson) entre la MA1 et la MA2 (r²=0.671).
On commence par construire des Tibbles contenant chaque mot exprimant un sentiment positif ou négatif (colonne word), puis on compte le nombre d’occurence de chaque mot (colonne n).
library(tidytext)
bing<-get_sentiments("bing")
bingStem <- bing %>% mutate(word = wordStem(word)) %>% unique()
senti1<-unnested_tokens1 %>%
inner_join(bing) %>%
count(word, sort = TRUE)
senti2<-unnested_tokens2 %>%
inner_join(bing) %>%
count(word, sort = TRUE)
senti3<-unnested_tokens3 %>%
inner_join(bing) %>%
count(word, sort = TRUE)
senti4<-unnested_tokens4 %>%
inner_join(bing) %>%
count(word, sort = TRUE)
On ne conserve que les dix premières valeurs et les dix dernières valeurs, afin de pouvoir produire des graphiques plus lisibles ne conservant que les valeurs extrêmes.
library(tidyr)
MA1_senti <- senti1 %>%
inner_join(get_sentiments("bing")) %>%
anti_join(custom_stop_words, by = c("word")) %>%
pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
mutate(sentiment = positive - negative)
sub1_MA1_senti<-MA1_senti %>%
arrange(sentiment) %>%
slice(1:10)
sub2_MA1_senti<-MA1_senti %>%
arrange(desc(sentiment)) %>%
slice(1:10)
sub_MA1_senti<-bind_rows(sub1_MA1_senti, sub2_MA1_senti)
On réalise un premier barplot de sentiment à titre d’exemple, en associant à chaque mot positif l’indice +1, et à chaque mot négatif l’indice -1. On représente ensuite cela graphiquement chaque mot en abscisse et la somme de ses indices (dont la valeur dépend de sa connotation et du nombre d’occurences) en ordonnées. On peut noter que certains mots neutres dans un contexte scientifique (comme “plot” ou “manipulation”) ont été rajoutés au dictionaire de “stop words”, pour éviter qu’ils soient considérés à tort comme des mots à valence négative.
ggplot(sub_MA1_senti, aes(x = word, y = sentiment,
fill = factor(sign(sentiment)))) +
geom_bar(stat = "identity") +
labs(x = "Word", y = "Sentiment Score", fill = "Sentiment") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
On répète le processus pour comparer les métaanalyses 1,2,3 et 4.
library(tidyr)
library(ggplot2)
plot_sentiment_subset <- function(senti) {
MA_senti <- senti %>%
inner_join(bingStem) %>%
pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) %>%
mutate(sentiment = positive - negative)
sub1_MA_senti <- MA_senti %>%
anti_join(custom_stop_words, by = c("word")) %>%
arrange(sentiment) %>%
slice(1:5)
sub2_MA_senti <- MA_senti %>%
anti_join(custom_stop_words, by = c("word")) %>%
arrange(desc(sentiment)) %>%
slice(1:5)
sub_MA_senti <- bind_rows(sub1_MA_senti, sub2_MA_senti)
ggplot(sub_MA_senti, aes(x = word, y = sentiment,
fill = factor(sign(sentiment)))) +
geom_bar(stat = "identity") +
labs(x = "Word", y = "Sentiment Score", fill = "Sentiment") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
}
plot_senti1<-plot_sentiment_subset(senti1)
plot_senti2<-plot_sentiment_subset(senti2)
plot_senti3<-plot_sentiment_subset(senti3)
plot_senti4<-plot_sentiment_subset(senti4)
library(egg)
ggarrange(plot_senti1,plot_senti2,plot_senti3,plot_senti4,widths = c(2,2),
labels = c("1","2","3","4"))
Tout d’abord, il est immportant de noter que tous les graphes n’ont
pas les mêmes échelles ; les MA1 et 4 semblent avoir des échelles de
sentiment comparables ([-20;10] et [-10;15]) et cela vaut aussi pour les
MA2 et 3 ([-10;5] et [-5;10]).
Le terme “strong” est commun à toutes les métaanalyses.
Cependant, sa valence peut grandement dépendre du contexte de son
utilisation.
On peut constater que le mot positif
“rich/enrich” est retrouvé dans la plupart de métaanalyses (1,2
et 3).
Le mot “benefit” n’est retrouvé que dans les MA2 et
4.
Le mot “protect” n’est retrouvé que dans la MA3.
On peut constater qu’il n’y a aucun mot négatif commun à tous les
corpus.
Le mot “disturb” n’est retrouvé que dans les MA 1
et 3.
Le mot “infest” est seulement présent dans les MA2 et
4.
Le mot “loss” n’est retrouvé que dans les MA1 et 4, ce
qui semble indiquer que les effets négatifs relevés ne sont pas
forcément liés à des pertes de caractéristiques.
Le mot
“sever” n’est retrouvé que dans les MA3 et 4, ce qui signifie
peut-être qu’elles sont plus “quantitatives” que les deux autres.
On
peut enfin constater que le mot “loss” est le mot avec le score
négatif le plus important des quatre graphiques, représenté dans la
MA1.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
bing_word_counts1 <- unnested_tokens1 %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
mutate(MA="MA1") %>%
ungroup()
bing_word_counts2 <- unnested_tokens2 %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
mutate(MA="MA2") %>%
ungroup()
bing_word_counts3 <- unnested_tokens3 %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
mutate(MA="MA3") %>%
ungroup()
bing_word_counts4 <- unnested_tokens4 %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
mutate(MA="MA4") %>%
ungroup()
contrib1<-bing_word_counts1 %>%
anti_join(custom_stop_words, by = c("word")) %>%
group_by(sentiment) %>%
slice_max(n, n = 10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(n, word, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(x = "Contribution to sentiment",
y = NULL)
contrib2<-bing_word_counts2 %>%
anti_join(custom_stop_words, by = c("word")) %>%
group_by(sentiment) %>%
slice_max(n, n = 10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(n, word, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(x = "Contribution to sentiment",
y = NULL)
contrib3<-bing_word_counts3 %>%
anti_join(custom_stop_words, by = c("word")) %>%
group_by(sentiment) %>%
slice_max(n, n = 10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(n, word, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(x = "Contribution to sentiment",
y = NULL)
contrib4<-bing_word_counts4 %>%
anti_join(custom_stop_words, by = c("word")) %>%
group_by(sentiment) %>%
slice_max(n, n = 10) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(n, word, fill = sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~sentiment, scales = "free_y") +
labs(x = "Contribution to sentiment",
y = NULL)
library(egg)
ggarrange(contrib1,contrib2,contrib3,contrib4,widths = c(2,2),
labels = c("1","2","3","4"))
bingStem %>% filter(word=="domin")
## # A tibble: 2 × 2
## word sentiment
## <chr> <chr>
## 1 domin positive
## 2 domin negative
library(stringr)
bing %>% filter(str_detect(word, "^domin"))
## # A tibble: 5 × 2
## word sentiment
## <chr> <chr>
## 1 dominate positive
## 2 dominated positive
## 3 dominates positive
## 4 domineer negative
## 5 domineering negative
library(stringr)
unnested_tokens <- tibble(abstracts) %>%
unnest_tokens(word, abstracts)
unnested_tokens %>% filter(str_detect(word, "^domin")) %>% distinct() %>%
print()
## # A tibble: 3 × 1
## word
## <chr>
## 1 dominated
## 2 dominant
## 3 dominating
# Append the unnested tokens to the list
unnested_tokens<-unnested_tokens%>%anti_join(stop_words)
unnested_tokens<-unnested_tokens %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
Comme on peur le voir, dans le corpus de texte, “domin”
a donc une valence positive et non négative. Dans la
suite de cette analyse, les occurences négatives de ce mot seront donc
négligées.
Tout d’abord, il faut noter que les graphiques ne sont pas à la même
échelle en abscisse. Cela ne pose en théorie pas de problème pour
interpréter les résultats au cas par cas, mais cela rentrera en jeux
lors d’éventuelles comparaisons entre métaanalyses.
Les quatre mots positifs les plus importants en contribution sont:
* MA1: “effect”, affect”, “abundant”,“dominate”.
*
MA2: “effect”, “affect”, “response”,“enhance”.
*
MA3: “effect”, “rich”, “abundant”, “affect”.
*
MA4: “effect”, “product”,“affect”,“fertilize”.
Les mots “effect” et “affect” sont présents dans
toutes les métaanalyses. Leur sens précis, cependant, dépend du
contexte.
MA1: Les mots “abundant” et
“dominate” évoquent l’écologie et les écosystèmes. La présence,
dans le graphe, de mots comme “content”, “dynamic”,
“available” ou encore “survive” laissent penser que le
texte étudie la dynamique des ressources disponibles dans le sol, en
lien avec des problématiques de survie.
MA2: Les mots
“response” et “enhance” semblent décrire des
mécanismes physiologiques de réponse à l’environnement, ainsi qu’une
augmentation, probablement de la croissance ou de la résistance de la
plante, d’après le titre de la métaanalyse. Dans cet intervalle, il y a
plus de mots positifs que de mots négatifs.
MA3: Les mots
“rich” et “abundant” semblent évoquer la richesse
écosystémique, ainsi que la “dynamique”, probablement des
écosystèmes, face à l’arrivée des vers de terre invasifs.
MA4:
Les mots “product” et “fertilize” font partie du
champs lexical de l’agriculture. Avec “enhance”, ils semblent
montrer un impact plutôt positif des vers de terre sur la production des
plantes. Dans cet intervalle, il y a plus de mots positifs que de mots
négatifs.
Les quatre mots négatifs les plus importants (en ignorant
“content”, “domin” et “floor”) en contribution sont:
*
MA1: “invasive”, “invade”, “loss”, “negative”.
*
MA2: “drought”, “infest”, “negative”,“dead”.
*
MA3: “invasive”, “disturb”, “burn”,“negative”.
*
MA4: “infest”, “invade”, “sever”,“negative”.
MA2 et
4:On remarque la présence du mot “infest”, respectivement
en deuxième et première positions pour les MA2 et 4. Son association à
“dead” (MA2) et à “loss” et “pest” (MA4)
traduit une vision probablement négative du vers de terre dans ces
métaanalyse, avec probablement des dommages écosystémiques
importants.
MA1 et 4:Dans les MA1 et 4, la présence de
“invade” et “negative”, présentant le vers de terre
comme un problème, qui, sans forcément détruire totalement
l’environnement natif, le perturbe (“disturb”) (MA1) ou
est perçu comme un nuisible (“pest”) (MA4).
MA1
et 3: Les mots “invasive” (1er positions dans les deux MA)
et “negative” sont communs (dernière position dans les deux
MA). La MA1 se focalise davantage sur l’invasion en
tant que telle et la perte, et la MA3 sur la
perturbation et la perte (“burn”). On
constate donc que les thèses défendues semblent concordantes et
négatives sur la question des vers de terre.
La MA2 semble
légèrement différente des autres dans son approche, avec des mots
uniques qui lui sont propres tels que “drought” ou bien
“dead”. D’autres mots comme “stress” ou
“parasite”, au vu du titre de la métaanalyse, semblent décrire
des effets négatifs sur les plantes.
Da façon simpliste, il semble donc possible, à partir de ces
graphiques, de proposer une première catégorisation comme suit:
-
MA1/MA3: Métaanalyses globalement défavorables aux vers de
terre. Si certains bénéfices, pour la santé des sols notamment, semblent
être reconnus, le vers de terre est perçu comme une espèce invasive
perturbant les écosystèmes natifs.
- MA2/MA4:
Métaanalyses globalement favorables au vers de terre, mettant en avant
les bienfaits physiologiques des vers de terre pour la plante et les
avantages de ces interactions pour favoriser la productivité. Cependant,
le vers de terre peut malgré tout rester nuisible, car c’est une espèce
invasive qui risque de déséquilibrer l’écosystème
natif.
Cependant, il serait peut-être nécessaire d’étudier des unités textuelles plus larges, comme par exemple les phrases ou les n-grames, pour éviter au maximum le risque de contresens.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
Visuellement, on peut voir sur le nuage de mots que les termes prépondérants dans la MA1 sont : “earthworm”,“soil”,“forest”,“increase” et “effect”. On peut remarquer aussi que le mot “invasion” semble aussi relativement fréquent, ce qui est cohérent avec le titre de l’article (“invasive earthworms”). La prépondérance du mot “earthworm” sur les autres semble confirmer que les vers de terre sont le sujet principal de cette métaanalyse.
library(wordcloud)
library(dplyr)
unnested_tokens1 %>%
anti_join(stop_words) %>%
count(word) %>%
with(wordcloud(word, n, max.words = 50))
cloud1 <- recordPlot()
Visuellement, on peut voir sur le nuage de mots que les termes prépondérants dans la MA2 sont : “plant”,“earthworm”,“aphid”, “soil”,“increase” et “effect”. D’autres mots tel que “community”, “interaction”, “presence”,“affect” ou “biomass” semblent décrire un processus biologique dynamique. La prépondérance de “plant” sur les autres semble confirmer que la biologie végétale en lien avec les vers de terre est le thème principal de cette métaanalyse.
unnested_tokens2 %>%
anti_join(stop_words) %>%
count(word) %>%
with(wordcloud(word, n, max.words = 50))
cloud2 <- recordPlot()
Visuellement, on peut voir sur le nuage de mots que les termes prépondérants dans la MA3 sont : “earthworm”,“specie”, “plant” et “forest”. La prépondérance des mots “earthworm” et “specie” sur les autres semble confirmer que la métaanlyse s’intéresse en particulier à la façon dont les différentes espèces de vers de terre (natives ou introduite) influent sur l’écosystème global (et notamment l’écosystème forestier). D’autres racines telles que “invasion”, “community”, “density”, “native” ou “increase” semblent décrire un processus écologique dynamique.
unnested_tokens3 %>%
anti_join(stop_words) %>%
count(word) %>%
with(wordcloud(word, n, max.words = 50))
cloud3 <- recordPlot()
Visuellement, on peut voir sur le nuage de mots que les termes prépondérants dans la MA4 sont : “earthworm”,“soil”, “plant”, “effect” et “increase”. Les mots “presence”, “community”, “product”, “biomass” et “growth” laissent entendre un effet plutôt positif des vers de terre sur le développement végatal.
unnested_tokens4 %>%
anti_join(stop_words) %>%
count(word) %>%
with(wordcloud(word, n, max.words = 50))
cloud4 <- recordPlot()
Visuellement, on peut remarquer sur le nuage de mots que les termes positfs prépondérants dans la MA1 sont “effect”, “affect” et abundant, tandis que les termes négatifs prépondérants sont “invasive”, “invade” et “loss”. On remarque tout d’abord que ces résultats sont très différents de ceux trouvés dans la partie précédente pour la même métaanalyse (Wordclouds: Wordcloud MA1) à cause de l’ajout de la variable “sentiment”. Grâce à ce nuage de points, on retrouve de manière sythétique les résultats obtenues dans la partie précédante, “Contribution de chaque terme au score final de sentiment”, pour la MA1.
library(reshape2)
unnested_tokens1 %>%
anti_join(custom_stop_words, by = c("word")) %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
acast(word ~ sentiment, value.var = "n", fill = 0) %>%
comparison.cloud(colors = c("red", "blue"),
max.words = 100)
cloud_senti1<-recordPlot()
Visuellement, on peut remarquer sur le nuage de mots que les termes positfs prépondérants dans la MA1 sont “effect”, “affect”, “response” / enhance (approximativement de même taille), tandis que les termes négatifs prépondérants sont “drought”, “infest” et “negative”/“dead” (“complex” n’étant pas nécessairement connoté négativement dans un contexte scientifique). On remarque tout d’abord que ces résultats sont très différents de ceux trouvés dans la partie précédente pour la même métaanalyse (Wordclouds: Wordcloud MA2) à cause de l’ajout de la variable “sentiment”. Grâce à ce nuage de points, on retrouve de manière sythétique les résultats obtenues dans la partie précédante, “Contribution de chaque terme au score final de sentiment”, pour la MA2.
unnested_tokens2 %>%
anti_join(custom_stop_words, by = c("word")) %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
acast(word ~ sentiment, value.var = "n", fill = 0) %>%
comparison.cloud(colors = c("red", "blue"),
max.words = 100)
cloud_senti2<-recordPlot()
Visuellement, on peut remarquer sur le nuage de mots que les termes positfs prépondérants dans la MA1 sont “effect”, “rich”, et “abundant” tandis que les termes négatifs prépondérants sont “invasive”, “disturb” et “burn”. On remarque tout d’abord que ces résultats sont très différents de ceux trouvés dans la partie précédente pour la même métaanalyse (Wordclouds: Wordcloud MA3) à cause de l’ajout de la variable “sentiment”. Grâce à ce nuage de points, on retrouve de manière sythétique les résultats obtenus dans la partie précédante, “Contribution de chaque terme au score final de sentiment”, pour la MA3.
unnested_tokens3 %>%
anti_join(custom_stop_words, by = c("word")) %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
acast(word ~ sentiment, value.var = "n", fill = 0) %>%
comparison.cloud(colors = c("red", "blue"),
max.words = 100)
cloud_senti3<-recordPlot()
Visuellement, on peut remarquer sur le nuage de mots que les termes positfs prépondérants dans la MA1 sont “effect”, “product”, et “affect” tandis que les termes négatifs prépondérants sont “infest”, “invade” et “sever”. On remarque tout d’abord que ces résultats sont très différents de ceux trouvés dans la partie précédente pour la même métaanalyse (Wordclouds: Wordcloud MA3) à cause de l’ajout de la variable “sentiment”. Grâce à ce nuage de points, on retrouve de manière sythétique les résultats obtenus dans la partie précédante, “Contribution de chaque terme au score final de sentiment”, pour la MA4.
unnested_tokens4 %>%
anti_join(custom_stop_words, by = c("word")) %>%
inner_join(bingStem) %>%
count(word, sentiment, sort = TRUE) %>%
acast(word ~ sentiment, value.var = "n", fill = 0) %>%
comparison.cloud(colors = c("red", "blue"),
max.words = 100)
cloud_senti4<-recordPlot()
sentences1 <- tibble(text = abstracts1) %>%
unnest_tokens(sentence, text, token = "sentences")
sentences2 <- tibble(text = abstracts2) %>%
unnest_tokens(sentence, text, token = "sentences")
sentences3 <- tibble(text = abstracts3) %>%
unnest_tokens(sentence, text, token = "sentences")
sentences4 <- tibble(text = abstracts4) %>%
unnest_tokens(sentence, text, token = "sentences")
library(dplyr)
library(purrr)
library(kableExtra)
bingnegative <- get_sentiments("bing") %>%
filter(sentiment == "negative")
bingpositive <- get_sentiments("bing") %>%
filter(sentiment == "positive")
unnested_tokens1 <- unnested_tokens1 %>%
mutate(MA = "MA1")
unnested_tokens2 <- unnested_tokens2 %>%
mutate(MA = "MA2")
unnested_tokens3 <- unnested_tokens3 %>%
mutate(MA = "MA3")
unnested_tokens4 <- unnested_tokens4 %>%
mutate(MA = "MA4")
MA_labels <- c("MA1", "MA2", "MA3", "MA4")
word_counts_MA <- c(length(unnested_tokens1$word),
length(unnested_tokens2$word),
length(unnested_tokens3$word),
length(unnested_tokens4$word))
word_count_tibble <- tibble(
MA = MA_labels,
words = word_counts_MA
)
all_ratios <- bind_rows(unnested_tokens1,unnested_tokens2,unnested_tokens3,
unnested_tokens4)
joined_tibble <- rbind(inner_join(all_ratios, bingnegative, by = "word"),
inner_join(all_ratios, bingpositive, by= "word"))
# Assuming joined_tibble is already defined
sentiment_counts <- joined_tibble %>%
group_by(MA, sentiment) %>%
summarise(count = n())
# Transpose the summarized counts
sentiment_counts <- sentiment_counts %>%
pivot_wider(names_from = sentiment, values_from = count)
library(dplyr)
library(purrr)
library(kableExtra)
bingnegative <- get_sentiments("bing") %>%
filter(sentiment == "negative")
bingpositive <- get_sentiments("bing") %>%
filter(sentiment == "positive")
unnested_tokens1 <- unnested_tokens1 %>%
mutate(MA = "MA1")
unnested_tokens2 <- unnested_tokens2 %>%
mutate(MA = "MA2")
unnested_tokens3 <- unnested_tokens3 %>%
mutate(MA = "MA3")
unnested_tokens4 <- unnested_tokens4 %>%
mutate(MA = "MA4")
MA_labels <- c("MA1", "MA2", "MA3", "MA4")
word_counts_MA <- c(length(unnested_tokens1$word),
length(unnested_tokens2$word),
length(unnested_tokens3$word),
length(unnested_tokens4$word))
word_count_tibble <- tibble(
MA = MA_labels,
words = word_counts_MA
)
all_ratios <- bind_rows(unnested_tokens1,unnested_tokens2,unnested_tokens3,
unnested_tokens4)
joined_tibble <- rbind(inner_join(all_ratios, bingnegative, by = "word"),
inner_join(all_ratios, bingpositive, by= "word"))
MA_titles <- c("Soil chemistry turned upside down: a meta-analysis [...]",
"Earthworms affect plant growth and resistance [...]",
"The unseen invaders: [...] in north American forests
(a meta-analysis)",
"Earthworms increase plant production: a meta-analysis")
positive_count=c(sentiment_counts$positive[1], sentiment_counts$positive[2],
sentiment_counts$positive[3], sentiment_counts$positive[4])
negative_count=c(sentiment_counts$negative[1], sentiment_counts$negative[2],
sentiment_counts$negative[3], sentiment_counts$negative[4])
summary_tibble <- joined_tibble %>%
group_by(MA) %>%
summarize(
positivewords = positive_count,
negativewords = negative_count,
sentimentwords=positive_count + negative_count
) %>%
left_join(word_count_tibble, by = "MA") %>%
mutate(positive_ratio = signif(positivewords / sentimentwords,digits = 2)) %>%
mutate(negative_ratio = signif(negativewords / sentimentwords,digits = 2))
summary_tibble <- data.frame(
MA = unique(summary_tibble$MA),
positivewords = unique(summary_tibble$positivewords),
negativewords = unique(summary_tibble$negativewords),
words = unique(summary_tibble$sentimentwords),
positive_ratio = unique(summary_tibble$positive_ratio),
negative_ratio = unique(summary_tibble$negative_ratio)
) %>%head(4)
summary_tibble <- as_tibble(summary_tibble)
summary_tibble %>%
mutate(MA_title = MA_titles) %>%
mutate(current_MA = MA) %>%
select(MA_title, current_MA, words, positivewords,
negativewords, positive_ratio, negative_ratio)
## # A tibble: 4 × 7
## MA_title current_MA words positivewords negativewords positive_ratio
## <chr> <chr> <int> <int> <int> <dbl>
## 1 "Soil chemistry t… MA1 231 82 149 0.35
## 2 "Earthworms affec… MA2 115 24 91 0.21
## 3 "The unseen invad… MA3 68 30 38 0.44
## 4 "Earthworms incre… MA4 138 56 82 0.41
## # ℹ 1 more variable: negative_ratio <dbl>
summary_tibble %>%
kbl() %>%
kable_material_dark("hover", full_width = F) %>%
row_spec(0, bold = T, color = "black", background = "#D7261E")
| MA | positivewords | negativewords | words | positive_ratio | negative_ratio |
|---|---|---|---|---|---|
| MA1 | 82 | 149 | 231 | 0.35 | 0.65 |
| MA2 | 24 | 91 | 115 | 0.21 | 0.79 |
| MA3 | 30 | 38 | 68 | 0.44 | 0.56 |
| MA4 | 56 | 82 | 138 | 0.41 | 0.59 |
Le tablau ci-dessus présente, pour chaque MA, le rapport mot
positifs / total sentiment (colonne “positive ratio”) et le le rapport
mot négatifs / total sentiment (colonne “negative ratio”). On peut donc
classer les MA dans cet ordre, la plus positive en dernier: MA2, MA1,
MA4, MA3. On peut donc écrire, de manière synthétique, que:
*
MA1: 35% des mots connotés sont positifs, 65% sont
négatifs.
* MA2: 21% des mots connotés sont
positifs, 79% sont négatifs.
* MA3: 44% des mots
connotés sont positifs, 56% sont négatifs.
* MA4:
41% des mots connotés sont positifs, 59% sont négatifs.
Ces ratios
semblent plutôt surprenants, car des métaanalyses au titre paraissant
négatif (comme la MA3), ont finalement le ratio de mots positifs le plus
élévé des quatre. A l’inverse, la MA2 semble être la plus négative alors
que son titre paraît plutôt optimiste. Une analyse plus approfondie des
textes permettrait probablement de résoudre cet apparent paradoxe.
Cependant, le ratio de mots négatifs est dans tous les cas > 50%, ce
qui semble indiquer que la vision du vers de terre présentée dans ces
articles est majoritairement négative.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
Définitions:
tf: term
frequency.
idf: inverse document frequency. Plus élaboré
que l’approche en “stop words”. Diminue la fréquence des termes
rencontrés très souvent et augmente la fréquence des termes rares, en
jouant sur la pondération.
tf-idf: le produit de ces deux
indices. Il premet d’identifier les mots qui sont plus
importants pour un document spécifique parmi un ensemble de
documents.
unnested_tokens1 <- tibble(abstracts1) %>%
mutate(MA="MA1") %>%
unnest_tokens(word, abstracts1)
unnested_tokens1<-unnested_tokens1 %>% rowwise()%>%
mutate(word = wordStem(word, language = "en"))
unnested_tokens2 <- tibble(abstracts2) %>%
mutate(MA="MA2") %>%
unnest_tokens(word, abstracts2)
unnested_tokens2 <- unnested_tokens2 %>%
rowwise() %>% mutate(word = wordStem(word, language = "en"))
unnested_tokens3 <- tibble(abstracts3) %>%
mutate(MA="MA3") %>%
unnest_tokens(word, abstracts3)
unnested_tokens3 <- unnested_tokens3 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
unnested_tokens4 <- tibble(abstracts4) %>%
mutate(MA="MA4") %>%
unnest_tokens(word, abstracts4)
unnested_tokens4 <- unnested_tokens4 %>% rowwise() %>%
mutate(word = wordStem(word, language = "en"))
word_counts_MA <- c(length(unnested_tokens1$word),
length(unnested_tokens2$word),
length(unnested_tokens3$word),
length(unnested_tokens4$word))
ordre1=unnested_tokens1 %>%
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
tokens_ordered_1 <- left_join(unnested_tokens1, ordre1) %>%
mutate(Total=word_count_tibble$words[1])
ordre2=unnested_tokens2 %>%
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
tokens_ordered_2 <- left_join(unnested_tokens2, ordre2) %>%
mutate(Total=word_count_tibble$words[2])
ordre3=unnested_tokens4 %>%
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
tokens_ordered_3 <- inner_join(unnested_tokens3, ordre3) %>%
mutate(Total=word_count_tibble$words[3])
ordre4=unnested_tokens4 %>%
count(word, sort = TRUE) %>%
mutate(word = reorder(word, n,decreasing=TRUE))
tokens_ordered_4 <- left_join(unnested_tokens4, ordre4) %>%
mutate(Total=word_count_tibble$words[4])
all_freq <- bind_rows(tokens_ordered_1,
tokens_ordered_2,
tokens_ordered_3,
tokens_ordered_4) %>%
mutate(word_frequency = n/Total)
library(ggplot2)
library(egg)
word_freq_plot1 <- ggplot(all_freq, aes(x = word_frequency, fill = MA)) +
geom_histogram(bins=100,show.legend = FALSE) +
ggtitle("xlim = max_word_frequency") +
theme(plot.title = element_text(hjust = 0.5)) +
xlim(NA, max(all_freq$word_frequency)) +
facet_wrap(~MA, ncol = 2, scales = "free_y")
word_freq_plot2 <-ggplot(all_freq, aes(x = word_frequency, fill = MA)) +
geom_histogram(bins=100,show.legend = FALSE) +
ggtitle("xlim = 0.05") +
theme(plot.title = element_text(hjust = 0.5)) +
xlim(NA, 0.05) +
facet_wrap(~MA, ncol = 2, scales = "free_y")
ggarrange(word_freq_plot1,word_freq_plot2,widths = c(1,2))
Ces graphiques présentent des distributions proches pour toutes les MA, avec de nombreux mots qui apparaissent rarement et moins de mots qui apparaissent fréquemment (le premier groupe de 4 graphes représentant l’intégralité des données, le deuxième groupe de 4 se focalisant uniquement sur l’intervalle [0;0.05], pour inspecter le massif de pics davantage en détail). En x, on peut voir que les mots apparaissant très souvent (à droite) sont rares, alors que les mots qui apparaissent peu souvent (à gauche) sont fréquents. Ces graphiques présentent des distributions similaires pour toutes les MA, avec de nombreux mots qui apparaissent rarement et moins de mots qui apparaissent fréquemment.
La loi de Zipf, découverte empiriquement par Zipf (1949) pour
des mots d’un corpus anglais, stipule que si f est la fréquence
d’un mot dans le corpus et r le rang, alors :
\(frequency \propto \frac{1}{rank}\)
(la
fréquence d’un mot donné est inversement proportionnelle à son
rang).
library(latex2exp)
library(ggokabeito)
freq_and_rank <- all_freq %>% group_by(MA) %>%
distinct(word, .keep_all = TRUE) %>%
arrange(desc(n)) %>%
mutate(rank = seq_len(length(word)), word_frequency = n/Total) %>% #
ungroup()
# freq_and_rank %>% filter(MA=='MA2')
freq_and_rank %>%
ggplot(aes(rank, word_frequency, color = MA)) +
geom_line(linewidth = 1.1, alpha = 0.8, show.legend = TRUE) +
scale_x_log10() +
scale_y_log10() +
scale_color_okabe_ito() +
xlab(TeX("$\\log_{10}(Rank)$")) +
ylab(TeX("$\\log_{10}(Word~Frequency)$"))
Les courbes de Zipf (log10(f) contre log10(r)) obtenues ci-dessus
ont une pente négative. On peut visualiser graphiquement qu’il existe
bel et bien une relation inversement proportionnelle entre f et
r (échelle logarithmique). On peut cependant remarquer que la
décroissance observée n’est pas strictement monotone. On pourrait
considérer ces courbes comme des lois de puissance brisées (fonction par
morceaux donnée par une séquence de lois de puissance jointes où chaque
section a sa propre puissance (indice) et est définie par des “ruptures”
limitatives.) et les diviser en trois sections:
[1;10]/[10;100]/[100;1000]. Voyons quel est l’exposant de la loi de
puissance pour la partie centrale de la plage de rangs.
rank_subset <- freq_and_rank %>%
filter(rank < 100,
rank > 10)
lm(log10(word_frequency) ~ log10(rank), data = rank_subset)
##
## Call:
## lm(formula = log10(word_frequency) ~ log10(rank), data = rank_subset)
##
## Coefficients:
## (Intercept) log10(rank)
## -0.7412 -0.8422
library(latex2exp)
freq_and_rank %>% ggplot(aes(rank, word_frequency, color = MA)) +
geom_abline(intercept = -0.8048, slope = -0.8272,
color = "gray50", linetype = 2) +
geom_line(linewidth = 1.1, alpha = 0.8, show.legend = TRUE) +
scale_x_log10() +
scale_y_log10() +
scale_color_okabe_ito() +
xlab(TeX("$\\log_{10}(Rank)$")) +
ylab(TeX("$\\log_{10}(Word~Frequency)$"))
On peut remarquer en ragardant la partie supérieure que la MA3 contient davantage de mots “rares” que la valeur prédite par le modèle linéaire, alors que toutes les autres (courbes orange, vertes et blues) en contiennent moins. La MA3 est donc celle qui contient la plus haute fréquence de mots rares. Ce résultat semble logique lorsqu’on considère que c’est aussi elle qui comprends le moins de mots totaux (MA3=1860 < MA2=2959 < MA4=4985 < MA1=5616, voir table ci-dessous). Pour ce qui est des mots très fréquents (quart inférieur droit sous 0.001 de fréquence), on peut constater que toutes les métaanalyses en contiennent moins que la valeur prédite. Au centre, les courbes des 4 MA sont relativement proche du modèle linéaire, ce qui n’est pas particulièrement étonnant car il a justement été ajusté pour convenir à l’intervalle correspondant à la partie centrale du graphe.
word_count_tibble%>%
kbl() %>%
kable_material_dark("hover", full_width = F) %>%
row_spec(0, bold = T, color = "black", background = "#D7261E")
| MA | words |
|---|---|
| MA1 | 5616 |
| MA2 | 2959 |
| MA3 | 1860 |
| MA4 | 4985 |
MA_tf_idf <- all_freq %>%
distinct(word, .keep_all = TRUE) %>%
select(-word_frequency) %>%
select(-Total) %>%
bind_tf_idf(word, MA, n) %>%
arrange(desc(tf_idf))
MA_tf_idf
## # A tibble: 2,221 × 6
## # Rowwise:
## MA word n tf idf tf_idf
## <chr> <chr> <int> <dbl> <dbl> <dbl>
## 1 MA3 requir 4 0.133 1.39 0.185
## 2 MA3 k 4 0.133 1.39 0.185
## 3 MA3 april 2 0.0667 1.39 0.0924
## 4 MA3 everi 2 0.0667 1.39 0.0924
## 5 MA3 19 2 0.0667 1.39 0.0924
## 6 MA3 open 2 0.0667 1.39 0.0924
## 7 MA3 na 2 0.0667 1.39 0.0924
## 8 MA2 aphid 50 0.0540 1.39 0.0749
## 9 MA1 the 488 0.0494 1.39 0.0685
## 10 MA1 and 456 0.0462 1.39 0.0640
## # ℹ 2,211 more rows
library(forcats)
MA_tf_idf %>%
anti_join(stop_words) %>%
anti_join(custom_stop_words) %>%
group_by(MA) %>%
slice_max(tf_idf, n = 15) %>%
ungroup() %>%
ggplot(aes(tf_idf, fct_reorder(word, tf_idf), fill = MA)) +
geom_col(show.legend = FALSE) +
scale_fill_okabe_ito() +
facet_wrap(~MA, ncol = 2, scales = "free") +
labs(x = "tf-idf", y = NULL)
D’après les graphiques ci-dessus, on peut constater que:
- Les
mots “earthworm”, “soil”, “forest” et
“effect” sont plus souvent employés dans la MA1 que dans les
autres MA. Le mot “invasion” est aussi plus présent dans la MA1
que dans les autres MA.
- Les mots “aphid,*”nematode”,
“herbivore”* et “legum” sont plus souvent employés dans la MA2
que dans les autres MA. Le mot “parasitoid” est aussi plus
présent dans la MA2 que dans les autres MA.
- Les mots
“require”, “na”, “every” et “april”
sont plus souvent employés dans la MA3 que dans les autres MA.
Les
mots “eastern”, “canopy” et “arthropod” sont
aussi plus présent dans la MA3 que dans les autres MA.
- Les mots
“maize,*”gtt”, “grain”* et “diplocardia” sont plus
souvent employés dans la MA4 que dans les autres MA. Les mots du champs
lexical de l’agriculture, comme “earth”, “plfa”,
“pb” (probablement employé ici comme le symbole chimique du
plomb) et “cu” (symbole chimique du cuivre) sont aussi plus
présents dans la MA4 que dans les autres MA.
Rappelons les suppositions faites précédemment dans la partie
“Analyse de sentiment”:
- MA1/MA3: Métaanalyses
globalement défavorables aux vers de terre. Si certains bénéfices, pour
la santé des sols notamment, semblent être reconnus, le vers de terre
est perçu comme une espèce invasive perturbant les écosystèmes
natifs.
- MA2/MA4: Métaanalyses globalement
favorables au vers de terre, mettant en avant les bienfaits
physiologiques des vers de terre pour la plante et les avantages de ces
interactions pour favoriser la productivité. Cependant, le vers de terre
peut malgré tout rester nuisible, car c’est une espèce invasive qui
risque de déséquilibrer l’écosystème natif.
En prenant en compte le sujet apparent de chaque métaanalyse, on peut
supposer que:
- MA1/MA3: Métaanalyses globalement
défavorables aux vers de terre. Si certains bénéfices, pour la santé des
sols notamment, semblent être reconnus, le vers de terre est perçu comme
une espèce invasive perturbant les écosystèmes natifs. Les mots “soil”,
“forest” et “effect” (MA1) et “canopy” (MA3), donnent une idée des
environnements où se sont déroulées les études (sols forestiers, forêt).
Les mots “exotic” (MA1) et “eastern” (MA3) semblent montrer que les
espèces invasives viennent probablement d’Europe ou d’Asie.
-
MA2/MA4: Métaanalyses globalement favorables au vers de
terre, mettant en avant les bienfaits physiologiques des vers de terre
pour la plante et les avantages de ces interactions pour favoriser la
productivité. Cependant, le vers de terre peut malgré tout rester
nuisible, car c’est une espèce invasive qui risque de déséquilibrer
l’écosystème natif. La MA2 semble plus se focaliser sur les effets
observées sur les plantes en tant que telles (pucerons, harbivores)
alors que la 4 semble davantage axée sur la pollution des sols,
notamment par les métaux lourds (Cu, Pb).
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
library(dplyr)
library(tidytext)
all_abstracts_df <- rbind(data.frame(abstract = abstracts1, MA = "MA1"),
data.frame(abstract = abstracts2, MA = "MA2"),
data.frame(abstract = abstracts3, MA = "MA3"),
data.frame(abstract = abstracts4, MA = "MA4"))
tokens_bigrams_all <- tibble(all_abstracts_df) %>%
unnest_tokens(bigram, abstract, token = "ngrams", n = 2) %>%
filter(!is.na(bigram))
tokens_bigrams1 <- tibble(abstracts1) %>%
unnest_tokens(bigram, abstracts1, token = "ngrams", n = 2) %>%
filter(!is.na(bigram))
tokens_bigrams2 <- tibble(abstracts2) %>%
unnest_tokens(bigram, abstracts2, token = "ngrams", n = 2) %>%
filter(!is.na(bigram))
tokens_bigrams3 <- tibble(abstracts3) %>%
unnest_tokens(bigram, abstracts3, token = "ngrams", n = 2) %>%
filter(!is.na(bigram))
tokens_bigrams4 <- tibble(abstracts4) %>%
unnest_tokens(bigram, abstracts4, token = "ngrams", n = 2) %>%
filter(!is.na(bigram))
tokens_bigrams1 %>% count(bigram, sort = TRUE)
## # A tibble: 6,279 × 2
## bigram n
## <chr> <int>
## 1 in the 81
## 2 of the 73
## 3 effects of 31
## 4 microbial biomass 31
## 5 organic matter 29
## 6 of earthworm 26
## 7 of earthworms 26
## 8 earthworm invasion 25
## 9 forest floor 25
## 10 c and 24
## # ℹ 6,269 more rows
tokens_bigrams2 %>%
count(bigram, sort = TRUE)
## # A tibble: 3,564 × 2
## bigram n
## <chr> <int>
## 1 in the 35
## 2 of earthworms 34
## 3 effects of 31
## 4 presence of 31
## 5 the presence 30
## 6 of the 28
## 7 on the 18
## 8 plant species 17
## 9 plant growth 16
## 10 affected by 15
## # ℹ 3,554 more rows
tokens_bigrams3 %>%
count(bigram, sort = TRUE)
## # A tibble: 2,448 × 2
## bigram n
## <chr> <int>
## 1 of the 19
## 2 in the 16
## 3 non native 15
## 4 plant species 15
## 5 native plant 14
## 6 earthworm species 11
## 7 of earthworm 11
## 8 and the 10
## 9 o tyrtaeum 10
## 10 changes in 9
## # ℹ 2,438 more rows
tokens_bigrams4 %>%
count(bigram, sort = TRUE)
## # A tibble: 6,044 × 2
## bigram n
## <chr> <int>
## 1 in the 80
## 2 of the 64
## 3 presence of 43
## 4 the presence 41
## 5 of earthworms 34
## 6 on the 28
## 7 the soil 27
## 8 plant community 26
## 9 effects of 25
## 10 in a 23
## # ℹ 6,034 more rows
De nombreux bigrammes sont non-informatifs (“in the”, “of the” etc.). On va donc réemployer l’approche en “stop words” des étapes précédentes pour enlever ces mots.
# bigrams ok, separated ok, filtered ok.
bigrams_separated_all <- tokens_bigrams_all %>%
separate(bigram, c("word1", "word2"), sep = " ")
bigrams_separated1 <- tokens_bigrams1 %>%
separate(bigram, c("word1", "word2"), sep = " ")
bigrams_filtered_all <- bigrams_separated_all %>%
filter(!word1 %in% combined_stop_words$word) %>%
filter(!word2 %in% combined_stop_words$word)
bigrams_filtered1 <- bigrams_separated1 %>%
filter(!word1 %in% combined_stop_words$word) %>%
filter(!word2 %in% combined_stop_words$word)
# new bigram counts:
bigram_counts_all <- bigrams_filtered_all %>%
count(MA, word1, word2, sort = TRUE)
bigram_counts1 <- bigrams_filtered1 %>%
count(word1, word2, sort = TRUE)
# For bigrams_2
bigrams_separated2 <- tokens_bigrams2 %>%
separate(bigram, c("word1", "word2"), sep = " ")
bigrams_filtered2 <- bigrams_separated2 %>%
filter(!word1 %in% combined_stop_words$word) %>%
filter(!word2 %in% combined_stop_words$word)
bigram_counts2 <- bigrams_filtered2 %>%
count(word1, word2, sort = TRUE)
# For bigrams_3
bigrams_separated3 <- tokens_bigrams3 %>%
separate(bigram, c("word1", "word2"), sep = " ")
bigrams_filtered3 <- bigrams_separated3 %>%
filter(!word1 %in% combined_stop_words$word) %>%
filter(!word2 %in% combined_stop_words$word)
bigram_counts3 <- bigrams_filtered3 %>%
count(word1, word2, sort = TRUE)
# For bigrams_4
bigrams_separated4 <- tokens_bigrams4 %>%
separate(bigram, c("word1", "word2"), sep = " ")
bigrams_filtered4 <- bigrams_separated4 %>%
filter(!word1 %in% combined_stop_words$word) %>%
filter(!word2 %in% combined_stop_words$word)
bigram_counts4 <- bigrams_filtered4 %>%
count(word1, word2, sort = TRUE)
bigrams_united_all <- bigrams_filtered_all %>%
unite(bigram, word1, word2, sep = " ")
bigrams_united_all %>% count(MA, bigram, sort = TRUE)
## # A tibble: 5,506 × 3
## MA bigram n
## <chr> <chr> <int>
## 1 MA1 microbial biomass 31
## 2 MA1 organic matter 29
## 3 MA4 plant community 26
## 4 MA1 earthworm invasion 25
## 5 MA1 forest floor 25
## 6 MA1 exotic earthworms 24
## 7 MA1 mineral soil 23
## 8 MA1 earthworm species 18
## 9 MA2 plant species 17
## 10 MA4 plant growth 17
## # ℹ 5,496 more rows
earthworms_bigrams <- bigrams_united_all %>%
filter(grepl("earthworms?", bigram, ignore.case = TRUE))
# Count occurrences of MA and word2 combination, sorted in descending order
count_earthworm_bigrams<- earthworms_bigrams %>%
count(MA, bigram, sort = TRUE) %>%
group_by(MA) %>%
filter(n>5) %>%
mutate(MA = factor(MA, levels = c("MA1", "MA2", "MA3", "MA4"))) %>%
# Set the order of MA
arrange(MA, desc(n)) # Sort by MA and then by n in descending order
count_earthworm_bigrams
## # A tibble: 22 × 3
## # Groups: MA [4]
## MA bigram n
## <fct> <chr> <int>
## 1 MA1 earthworm invasion 25
## 2 MA1 exotic earthworms 24
## 3 MA1 earthworm species 18
## 4 MA1 earthworm activity 9
## 5 MA1 earthworm biomass 8
## 6 MA1 earthworm invaded 7
## 7 MA1 european earthworms 7
## 8 MA1 exotic earthworm 7
## 9 MA1 earthworm community 6
## 10 MA2 earthworms increased 7
## # ℹ 12 more rows
library(dplyr)
# Define the function
count_filtered_bigrams <- function(data, regex_motif,treshold) {
# Filter the bigrams based on the provided regex motif
filtered_bigrams <- data %>%
filter(grepl(regex_motif, bigram, ignore.case = TRUE))
# Count occurrences of each combination of `MA` and `bigram`,
# sort in descending order,
# group by `MA`, and filter counts greater than 5 within each group
count_bigrams <- filtered_bigrams %>%
count(MA, bigram, sort = TRUE) %>%
group_by(MA) %>%
filter(n > treshold) %>%
mutate(MA = factor(MA, levels = c("MA1", "MA2", "MA3", "MA4"))) %>%
arrange(MA, desc(n)) # Sort by MA and then by n in descending order
return(count_bigrams)
}
count_filtered_bigrams(bigrams_united_all,"earthworms?",5)
## # A tibble: 22 × 3
## # Groups: MA [4]
## MA bigram n
## <fct> <chr> <int>
## 1 MA1 earthworm invasion 25
## 2 MA1 exotic earthworms 24
## 3 MA1 earthworm species 18
## 4 MA1 earthworm activity 9
## 5 MA1 earthworm biomass 8
## 6 MA1 earthworm invaded 7
## 7 MA1 european earthworms 7
## 8 MA1 exotic earthworm 7
## 9 MA1 earthworm community 6
## 10 MA2 earthworms increased 7
## # ℹ 12 more rows
count_filtered_bigrams(bigrams_united_all,"invasions?",5)
## # A tibble: 3 × 3
## # Groups: MA [2]
## MA bigram n
## <fct> <chr> <int>
## 1 MA1 earthworm invasion 25
## 2 MA3 earthworm invasion 7
## 3 MA3 earthworm invasions 6
count_filtered_bigrams(bigrams_united_all,"invaders?",0)
## # A tibble: 9 × 3
## # Groups: MA [2]
## MA bigram n
## <fct> <chr> <int>
## 1 MA1 earthworm invaders 1
## 2 MA1 invaders affect 1
## 3 MA4 invader plants 2
## 4 MA4 invader species 2
## 5 MA4 plant invader 2
## 6 MA4 invader biomass 1
## 7 MA4 invader seed 1
## 8 MA4 invader treatments 1
## 9 MA4 plant invaders 1
count_filtered_bigrams(bigrams_united_all,"europeans?",0)
## # A tibble: 23 × 3
## # Groups: MA [4]
## MA bigram n
## <fct> <chr> <int>
## 1 MA1 european earthworms 7
## 2 MA1 european species 5
## 3 MA1 european earthworm 4
## 4 MA1 european settlers 2
## 5 MA1 introduced european 2
## 6 MA1 invasive european 2
## 7 MA1 european lumbricids 1
## 8 MA1 exotic european 1
## 9 MA1 processes european 1
## 10 MA1 time european 1
## # ℹ 13 more rows
bigram_tf_idf <- bigrams_united_all %>%
count(MA, bigram) %>%
bind_tf_idf(bigram, MA, n) %>%
arrange(desc(tf_idf))
bigram_tf_idf %>%
group_by(MA) %>%
slice_max(tf_idf, n = 15) %>%
ungroup() %>%
ggplot(aes(tf_idf, fct_reorder(bigram, tf_idf), fill = MA)) +
geom_col(show.legend = FALSE) +
scale_fill_okabe_ito() +
facet_wrap(~MA, ncol = 2, scales = "free") +
labs(x = "tf-idf", y = NULL)
D’après les graphiques ci-dessus, on peut constater que:
Les
bigrammes “mineral soil”, “earthworm invasion”,
“exotic earthworms” et “forest soils” sont plus
souvent employés dans la MA1 que dans les autres MA. Le bigramme
“earthworm invaded” est aussi plus présent dans la MA1 que dans
les autres MA.
Les bigrammes “soil organisms”, “plant
responses”, “plant mediated” et “root herbivore”
sont plus souvent employés dans la MA2 que dans les autres MA. Le
bigramme “aphid species” est aussi plus présent dans la MA2 que
dans les autres MA.
Les bigrammes “tree species”,
“native plant”, “species richness” et “caterpillar
density” sont plus souvent employés dans la MA3 que dans les autres
MA. Le bigramme “earthworm invasions” est aussi plus présent
dans la MA3 que dans les autres MA.
Les bigrammes “soil
organisms”, “plant functionnal”, “dry weight” et
“diplocardia spp” sont plus souvent employés dans la MA4 que
dans les autres MA. Le bigramme “soil fertility” est aussi plus
présent dans la MA4 que dans les autres MA.
Rappelons les suppositions faites dans la section précédente:
-
MA1/MA3: Métaanalyses globalement défavorables aux vers
de terre. Si certains bénéfices, pour la santé des sols notamment,
semblent être reconnus, le vers de terre est perçu comme une espèce
invasive perturbant les écosystèmes natifs. Les mots “soil”, “forest” et
“effect” (MA1) et “canopy” (MA3), donnent une idée des environnements où
se sont déroulées les études (sols forestiers, forêt). Les mots “exotic”
(MA1) et “eastern” (MA3) semblent montrer que les espèces invasives
viennent probablement d’Europe ou d’Asie.
-
MA2/MA4: Métaanalyses globalement favorables au vers de
terre, mettant en avant les bienfaits physiologiques des vers de terre
pour la plante et les avantages de ces interactions pour favoriser la
productivité. Cependant, le vers de terre peut malgré tout rester
nuisible, car c’est une espèce invasive qui risque de déséquilibrer
l’écosystème natif. La MA2 semble plus se focaliser sur les effets
observées sur les plantes en tant que telles (pucerons, harbivores)
alors que la 4 semble davantage axée sur la pollution des sols,
notamment par les métaux lourds (Cu, Pb).
En prenant en compte le sujet apparent de chaque métaanalyse, on peut
supposer que:
- MA1/MA3: Métaanalyses globalement
défavorables aux vers de terre. Si certains bénéfices, pour la santé des
sols notamment, semblent être reconnus, le vers de terre est perçu comme
une espèce invasive perturbant les écosystèmes natifs. Les mots “soil”,
“forest” et “effect” (MA1) et “canopy” (MA3), donnent une idée des
environnements où se sont déroulées les études (sols forestiers, forêt).
Les mots “exotic” (MA1) et “eastern” (MA3) semblent montrer que les
espèces invasives viennent probablement d’Europe ou d’Asie. Les
bigrammes “forest soils” (MA1) et “tree species” (MA3) confirment que
les études s’intéressent aux environnements forestiers. Les bigrammes
“earthworm invasion” (MA1) et “earthworm invasions” (MA3) confirment que
les vers de terre asiatiques et européens sont perçus comme des
espèces invasives.
- MA2/MA4:
Métaanalyses globalement favorables au vers de terre, mettant en avant
les bienfaits physiologiques des vers de terre pour la plante et les
avantages de ces interactions pour favoriser la productivité. Cependant,
le vers de terre peut malgré tout rester nuisible, car c’est une espèce
invasive qui risque de déséquilibrer l’écosystème natif. La MA2 semble
plus se focaliser sur les effets observées sur les plantes en tant que
telles (pucerons, harbivores) alors que la 4 semble davantage axée sur
la pollution des sols, notamment par les métaux lourds (Cu, Pb). Le
bigramme “soil organisms” est le plus représenté dans les deux
métaanalyses, reforçant encore le lien thématique (écologie des sols)
commun aux MA2 et 4. Par ailleurs, de nombreuses références aux plantes
(“plant responses”, “plant mediated” et “root
herbivore” pour la MA2 et “plant functionnal”, “dry
weight” et “diplocardia spp” pour la MA4) montrent que les
deux MA s’intéressent spécifiquement au rôle des plantes dans
l’écologie des sols.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
library(ggplot2)
AFINN <-get_sentiments("afinn")
not_words <- bigrams_separated_all %>%
filter(word1 == "not") %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(word2, value, sort = TRUE)
not_words %>%
mutate(contribution = n * value) %>%
arrange(desc(abs(contribution))) %>%
mutate(word2 = reorder(word2, contribution)) %>%
ggplot(aes(contribution, word2, fill = contribution > 0)) +
geom_col(show.legend = FALSE) +
labs(x = "Sentiment value * number of occurrences",
y = "Words preceded by \"not\"")
Les bigrammes “not benefit” et “not increase” sont
les plus important facteur d’erreur d’identification, faisant paraître
le texte plus positif qu’il ne l’est réellement.
Le
bigramme “not affected” est le plus important facteur d’erreur
d’identification, faisant paraître le texte plus
négatif qu’il ne l’est réellement.
library(ggplot2)
AFINN <-get_sentiments("afinn")
bigrams_separated1 %>%
filter(word1 == "not") %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(word2, value, sort = TRUE)
## # A tibble: 2 × 3
## word2 value n
## <chr> <dbl> <int>
## 1 benefit 2 1
## 2 increase 1 1
not_words_with_factor <- bigrams_separated_all %>%
filter(word1 == "not") %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(MA, word2, value, sort = TRUE)
not_words_with_factor %>%
mutate(contribution = n * value) %>%
arrange(desc(abs(contribution))) %>%
mutate(word2 = reorder(word2, contribution)) %>%
ggplot(aes(contribution, word2, fill = contribution > 0)) +
geom_col(show.legend = FALSE) +
labs(x = "Sentiment value * number of occurrences",
y = "Words preceded by \"not\"") +
coord_fixed(ratio = 0.25)+
facet_wrap(facets = vars(MA), ncol = 1)
Lorsque l’on inspecte le jeu de données pour chacune des
MA avec la fonction R “facet_grid”, on remarque que
les mots ayant conduit au plus d’erreurs d’identification dans chaque MA
sont:
- MA1: “benefit” et “increase”
classés à tort en positif (comme le mot précédant était
“not”, “not benefit” et “not increase” ont une valance
négative), pas de négatif relevé. La MA1 est moins
positive que les analyses précédentes le laissaient penser.
- MA2: Pas de mot positif relevé. “affected” classé à
tort en négatif (comme le mot précédent était “not”,
“not affected” a une valence positive). La MA2
est plus positive que les analyses précédentes le laissaient
penser.
- MA3: Pas de mot positif relevé.
“affected” classé à tort en négatif (comme le
mot précédent était “not”, “not affected” a une valence
positive). On remarque cependant que l’effet observé est
moindre comparé à la MA2. La MA3 est plus positive que les
analyses précédentes le laissaient penser.
- MA4:
“responsible” (donc, le bigramme “not responsible”), est classé
positif par le dictionnaire AFINN, mais ces seuls deux mots ne suffisent
pas à déterminer la valence (positive ou négative), de l’expression.
Elles traduisent au contraire une forme de neutralité (quelque-chose qui
est non responsable d’un effet est à priori neutre).
Une analyse plus détaillée du contexte d’utilisation serait requise pour
pouvoir décider.
AFINN %>% filter(word %in% c("responsible", "prevent"))
## # A tibble: 2 × 2
## word value
## <chr> <dbl>
## 1 prevent -1
## 2 responsible 2
Dans AFINN (dictionnaire), “prevent” est classé négatif
(c’est pourquoi “not prevent” a une valence positive), mais en écologie,
“not prevent” semble bel et bien négatif (il n’y a donc pas
d’erreur d’identification dans cas précis). Par contre, classé à tort en
négatif, on retrouve là-aussi “affected”, dans
ce cas précédé par “not”, et donc de valence plutôt
positive. La MA4 est plus positive que les
analyses précédentes le laissaient penser.
Cependant, d’autres mots négatifs (comme “never” etc.) n’ont
pas été pris en compte dans l’analyse ci-dessus. La prochaine étape à
donc pour but de prendre davantage de mots de négation en considération
dans l’analyse de sentiment.
negation_words <- c("ain't", "aren't", "can't", "couldn't", "didn't", "doesn't",
"don't", "hasn't", "isn't", "mightn't", "mustn't",
"neither", "never", "no", "nobody", "nor",
"not", "shan't", "shouldn't", "wasn't", "weren't", "won't",
"wouldn't","without")
bigrams_separated_all %>%
filter(word1 %in% negation_words) %>%
inner_join(AFINN, by = c(word2 = "word"))
## # A tibble: 28 × 4
## MA word1 word2 value
## <chr> <chr> <chr> <dbl>
## 1 MA1 no significant 1
## 2 MA1 no significant 1
## 3 MA1 not increase 1
## 4 MA1 no greater 3
## 5 MA1 not benefit 2
## 6 MA1 no significant 1
## 7 MA1 no significant 1
## 8 MA1 neither affected -1
## 9 MA1 no significant 1
## 10 MA2 not affected -1
## # ℹ 18 more rows
library(dplyr)
library(ggplot2)
library(tidyr)
negation_words_with_factor <- bigrams_separated_all %>%
filter(word1 %in% negation_words) %>%
inner_join(AFINN, by = c(word2 = "word")) %>%
count(MA, word1, word2, value, sort = TRUE)
negation_words_with_factor %>%
mutate(contribution = n * value) %>%
arrange(desc(abs(contribution))) %>%
mutate(word2 = reorder(word2, contribution)) %>%
ggplot(aes(contribution, word2, fill = contribution > 0)) +
geom_col(show.legend = FALSE) +
labs(x = "Sentiment value * number of occurrences",
y = "Words preceded by negation word") +
#coord_fixed(ratio = 0.25)+ : ATTENTION, peut sévèrement interférer
#avec l'aspect d'un plot si mal utilisé.
facet_wrap(facets = vars(word1), ncol = 2)
Rappelons les suppositions faites dans la section
précédente:
- MA1/MA3: Métaanalyses globalement
défavorables aux vers de terre. Si certains bénéfices, pour la santé des
sols notamment, semblent être reconnus, le vers de terre est perçu comme
une espèce invasive perturbant les écosystèmes natifs. Les mots “soil”,
“forest” et “effect” (MA1) et “canopy” (MA3), donnent une idée des
environnements où se sont déroulées les études (sols forestiers, forêt).
Les mots “exotic” (MA1) et “eastern” (MA3) semblent montrer que les
espèces invasives viennent probablement d’Europe ou d’Asie. Les
bigrammes “forest soils” (MA1) et “tree species” (MA3) confirment que
les études s’intéressent aux environnements forestiers. Les bigrammes
“earthworm invasion” (MA1) et “earthworm invasions” (MA3) confirment que
les vers de terre asiatiques et européens sont perçus comme des espèces
invasives.
- MA2/MA4: Métaanalyses globalement
favorables au vers de terre, mettant en avant les bienfaits
physiologiques des vers de terre pour la plante et les avantages de ces
interactions pour favoriser la productivité. Cependant, le vers de terre
peut malgré tout rester nuisible, car c’est une espèce invasive qui
risque de déséquilibrer l’écosystème natif. La MA2 semble plus se
focaliser sur les effets observées sur les plantes en tant que telles
(pucerons, harbivores) alors que la 4 semble davantage axée sur la
pollution des sols, notamment par les métaux lourds (Cu, Pb). Le
bigramme “soil organisms” est le plus représenté dans les deux
métaanalyses, reforçant encore le lien thématique (écologie des sols)
commun aux MA2 et 4. Par ailleurs, de nombreuses références aux plantes
(“plant responses”, “plant mediated” et “root
herbivore” pour la MA2 et “plant functionnal”, “dry
weight” et “diplocardia spp” pour la MA4) montrent que les
deux MA s’intéressent spécifiquement au rôle des plantes dans l’écologie
des sols.
En prenant en compte le sujet apparent de chaque métaanalyse, on peut
supposer que:
- MA1/MA3: Métaanalyses globalement
défavorables aux vers de terre. Si certains bénéfices, pour la santé des
sols notamment, semblent être reconnus, le vers de terre est perçu comme
une espèce invasive perturbant les écosystèmes natifs. Les mots “soil”,
“forest” et “effect” (MA1) et “canopy” (MA3), donnent une idée des
environnements où se sont déroulées les études (sols forestiers, forêt).
Les mots “exotic” (MA1) et “eastern” (MA3) semblent montrer que les
espèces invasives viennent probablement d’Europe ou d’Asie. Les
bigrammes “forest soils” (MA1) et “tree species” (MA3) confirment que
les études s’intéressent aux environnements forestiers. Les bigrammes
“earthworm invasion” (MA1) et “earthworm invasions” (MA3) confirment que
les vers de terre asiatiques et européens sont perçus comme des espèces
invasives. La MA1 étant plus négative que prévu, sachant que la MA3
(plus positive que prévu) ne semble pas compenser totalement cet effet
(cf. “words preceded by not”), on en déduit que ces deux métaanalyses
sont un peu plus négatives que présenté précedemment, en raison de
l’effet du mot “not” sur le mot suivant.
- MA2/MA4:
Métaanalyses globalement favorables au vers de terre, mettant en avant
les bienfaits physiologiques des vers de terre pour la plante et les
avantages de ces interactions pour favoriser la productivité. Cependant,
le vers de terre peut malgré tout rester nuisible, car c’est une espèce
invasive qui risque de déséquilibrer l’écosystème natif. La MA2 semble
plus se focaliser sur les effets observées sur les plantes en tant que
telles (pucerons, harbivores) alors que la 4 semble davantage axée sur
la pollution des sols, notamment par les métaux lourds (Cu, Pb). Le
bigramme “soil organisms” est le plus représenté dans les deux
métaanalyses, reforçant encore le lien thématique (écologie des sols)
commun aux MA2 et 4. Par ailleurs, de nombreuses références aux plantes
(“plant responses”, “plant mediated” et “root
herbivore” pour la MA2 et “plant functionnal”, “dry
weight” et “diplocardia spp” pour la MA4) montrent que les
deux MA s’intéressent spécifiquement au rôle des plantes dans l’écologie
des sols. La MA2 étant plus positive que prévu, sachant que la MA4 est
aussi plus positive que prévu (cf. “words preceded by not”), on en
déduit que ces deux métaanalyses sont un peu plus positives que présenté
précedemment, en raison de l’effet du mot “not” sur le mot suivant.
- Faux positifs / faux négatifs: On peut remarquer que
le mot le plus important dans les faux négatifs est “not”, et que le
plus important dans les faux positfs est “no”. Le terme “neither” a
lui-aussi engendré quelques faux négatifs.
MA1: “Soil chemistry turned upside down: a meta-analysis of
invasive earthworm effects on soil chemical properties”
MA2:
“Earthworms affect plant growth and resistance against herbivores: A
meta-analysis”
MA3: “The unseen invaders: introduced earthworms as
drivers of change in plant communities in North American forests (a
meta-analysis)”
MA4: “Earthworms increase plant production: a
meta-analysis”
Visualiser les relations entre tous les mots simultanément, sous la forme d’un graphe noeuds / arrêtes. Un graphe est une combinaison de noeuds (mots) connectés, c’est à dire que leurs occurrences sont, dans le texte, proches les unes des autres. C’est une façon d’aller encore plus loin que de simplement regarder le mot précédant (bigrammes).
library(igraph)
library(ggraph)
bigram_counts_all_noMA <- bigram_counts_all %>% select(-MA)
bigram_graph <- bigram_counts_all_noMA %>%
filter(n > 10) %>%
graph_from_data_frame()
ggraph(bigram_graph, layout = "fr") +
geom_edge_link() +
geom_node_point() +
geom_node_text(aes(label = name), vjust = 1, hjust = 1)
Ce premier réseau de bigrammes (toutes MA confondues) nous
montre que trois mots sont un centre (un noeud avec au moins trois
connections):
- earthworm: Connecté avec
“species”, “invasion” et “activity”.
-
soil: Connecté avec “mineral”,
“microbial” et “organism”.
-
plant: Connecté avec “native”,
“plant” et “community/communities”.
Pour le
cluster centré sur “soil”, on remarque que “microbial” et “biomass” sont
connectés. De la même façon, les clusters mineurs (2 mots / 1 connexion)
indiquent que les mot “lumbricus terrestris”, “leaf litter”, exotic
earthworms”, “organic matter”, “forest floor” et “hardwood forest” sont
fréquement employés en groupe de mots. Cependant, l’abscence de flèches
sur ce graphe nous empêche de savoir avec certitude dans quel ordre ces
mots sont utilisés.
a <- grid::arrow(type = "closed", length = unit(.15, "inches"))
ggraph(bigram_graph, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
arrow = a, end_cap = circle(.07, 'inches')) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
theme_void()
Dans cette nouvelle version du même graphe:
- Les liens sont
orientés, afin de savoir quel mot est le premier de
chaque bigramme.
- L’opacité des flèches est
proportionnelle à la fréquence d’occurence du bigramme
(haute fréquence/ opacité élevée, basse fréquence/opacité réduite).
- Les noeuds sont plus larges et colorés en bleu clair.
Les
centres retrouvés sont:
- plant: “plant
community”, “plant growth”, “plant communities”, “native plant”.
-
soil: “mineral soil”, “soil microbial” + “microbial
biomass” (forte association), “soil organisms”.
-earthworm: “invasion”, “species”, “activity”.
D’autres bigrammes notables sont: “forest floor”, “exotic earthworm”,
“organic matter”, “leaf litter”, “northern hardwood” et “lumbricus
terretris”.
Grâce à ce nouveau graphe dont les liens sont
orientés, on est maintenant certain de l’ordre dans lequel les
mots composant les bigrammes apparaissaient.
library(igraph)
library(ggraph)
library(egg)
library(ggpubr)
library(ggplot2)
bigram_graph1 <- bigram_counts1 %>%
filter(n > 10) %>%
graph_from_data_frame()
network1 <- ggraph(bigram_graph1, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
arrow = a, end_cap = circle(.07, 'inches')) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1, size = 4) +
labs(title = "MA1")
bigram_graph2 <- bigram_counts2 %>%
filter(n > 10) %>%
graph_from_data_frame()
network2 <- ggraph(bigram_graph2, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
arrow = a, end_cap = circle(.07, 'inches')) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1, size = 4) +
labs(title = "MA2")
bigram_graph3 <- bigram_counts3 %>%
filter(n > 10) %>%
graph_from_data_frame()
network3 <- ggraph(bigram_graph3, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
arrow = a, end_cap = circle(.07, 'inches')) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1, size = 4) +
labs(title = "MA3")
bigram_graph4 <- bigram_counts4 %>%
filter(n > 10) %>%
graph_from_data_frame()
network4 <- ggraph(bigram_graph4, layout = "fr") +
geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
arrow = a, end_cap = circle(.07, 'inches')) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), vjust = 1, hjust = 1, size = 4) +
labs(title = "MA4")
library(patchwork)
networks <- network1 + network2 + network3 + network4 + plot_layout(nrow = 4)
network1
Les centres retrouvées sont:
- earthworm :
“invasion”, “species”.
D’autres bigrammes notables sont: “mineral
soil” –> “soil microbial” –> “microbial biomass”.
Ou
encore:
“exotic earthworms”, “organic matter”, “forest floor”, “leaf
litter”, “northern hardwood”, “lumbricus terrestris”.
network2
Les centres retrouvées sont:
- plant :
“species”, “growth”, “communities”.
“soil organism” est aussi un
bigramme fréquent.
network3
Aucun centre n’est retrouvé pour cette métaanalyse.
On peut
par contre retrouver une chaîne de mots reliés entre eux:
“native
plants” –> “plant species” –> “earthworm species”.
network4
Les centres retrouvées sont:
- plant :
“species”, “growth”, “community/communities”.
“soil organism” et
“earthworm activity” sont aussi des bigrammes fréquents.
En conclusion, on remarque que les centres retrouvés pour l’ensemble
des quatres MA (“earthworm”, “plant”, “soil”), sont souvent retrouvés
dans les MA individuellement (1- “earthworm”, 2- “plant”). Le cas de
“soil” est remarquable, car il est un centre global, sans pour autant
être un centre local dans aucune des quatre MA.
installed.packages()[names(sessionInfo()$otherPkgs), “Version”] = permet de visualiser les packages R non-natifs installés dans une session R.
library(dplyr)
library(tidytext)
library(stringr)
MA_section_words <- earthworms %>%
select(Abstract, MA) %>%
mutate(section = row_number() %/% 5) %>% # find word correlation within 5 lines / For example, rows 0-9 will have section 0, rows 10-19 will have section 1, and so on.
filter(section > 0) %>% # Filter rows where section is greater than 0
unnest_tokens(word, Abstract) %>%
mutate(MA = str_replace(MA, "MA", "")) %>% # replace MA1, MA2, MA3, MA4 with 1, 2, 3 and 4.
filter(!word %in% stop_words$word)
# MA_section_words$section %>% unique()
library(widyr)
# count words co-occuring within sections
word_pairs <- MA_section_words %>%
pairwise_count(word, section, sort = TRUE) # Count the number of times each pair of items appear together within a group defined by "feature." (here, 10-lines sections).
word_pairs %>%
filter(item1 == "earthworm")
## # A tibble: 2,740 × 3
## item1 item2 n
## <chr> <chr> <dbl>
## 1 earthworm soil 22
## 2 earthworm species 22
## 3 earthworm earthworms 22
## 4 earthworm biomass 22
## 5 earthworm results 22
## 6 earthworm increased 21
## 7 earthworm effects 20
## 8 earthworm plants 20
## 9 earthworm plant 20
## 10 earthworm experiment 19
## # ℹ 2,730 more rows
Le tableau ci-dessus présente les co-occurence de mots pour chacune
des sections de 10 lignes définies au préalable, filtré pour que le
premier mot soit “earthworm”. Dans une section de dix lignes, les trois
groupes de mots qui reviennent le plus souvent et commençant par
“earthworm” sont donc earthworm + earthworms (sans
doute la fin d’une phrase et le début d’une autre), earthworm +
effects et “earthworm + experiment”.
On veut maintenant observer les corrélations entre les mots: nb de
fois où ils apparaissent ensemble / nb de fois où ils apparaissent
séparément (coefficient Phi, équiv. corrélation de Pearson).
Le coefficient Phi permet de mesurer le degré (l’intensité) de liaison entre deux variables binaires (codées 0 ou 1). Les variables peuvent donc être soit des variables dichotomiques par nature (ex. genre = H / F) soit des variables que l’on dichotomise soi-même (découper / faire 2 classes à partir d’une variable continue). Plus le coefficent est proche de 0, moins il y a d’associations entre les 2 variables. Si celui-ci est proche de 1 ou -1, cela indique qu’il existe une forte dépendance (positive ou négative). Source: https://www.soft-concept.com/surveymag/definition-fr/definition-coefficient-de-phi.html.
# we need to filter for at least relatively common words first
word_cors <- MA_section_words %>%
group_by(word) %>%
pairwise_cor(word, section, sort = TRUE, use = "pairwise") %>% # the use = pairwise is necessary to get a good result.
na.omit()
# word_cors$correlation %>% unique()
# word_cors$correlation %>% table() --> plus précis que "unique".
word_cors %>%
filter(item1 == "earthworm")
## # A tibble: 2,821 × 3
## item1 item2 correlation
## <chr> <chr> <dbl>
## 1 earthworm sites 0.807
## 2 earthworm invasion 0.799
## 3 earthworm forests 0.779
## 4 earthworm hardwood 0.776
## 5 earthworm northern 0.767
## 6 earthworm dynamics 0.766
## 7 earthworm abundance 0.731
## 8 earthworm site 0.711
## 9 earthworm suggests 0.704
## 10 earthworm leading 0.681
## # ℹ 2,811 more rows
word_cors_ecology1= word_cors %>%
filter(item1 %in% c("earthworm","soil", "plants")) %>%
group_by(item1) %>%
slice_max(correlation, n = 5) %>% # the plot don't know how to manage the ex-aequo during classifying.
ungroup() %>%
mutate(item2 = reorder(item2, correlation)) %>%
ggplot(aes(item2, correlation)) +
geom_bar(stat = "identity") +
facet_wrap(~ item1, scales = "free") +
coord_flip()
word_cors_ecology1
Le calcul des corrélations à l’intérieur de groupes de cinq
lignes montre les termes fréquement employés au voisinage des mots
choisis pour cette première partie d’analyse
(earthworm/plant/soil).
earthworm:
“invasion”, “forest”, “hardwood”, “northern”. On peut en
déduire que dans les textes du corpus, les vers de terre sont souvent
liés à des invasions dans les forêts de feuillus d’Amérique du nord. On
retrouve ici un thème important de la MA3.
plants:
plant”, “detritivores”, “aphid”, “herbivores”. On peut en
déduire que dans les textes du corpus, les plantes sont souvent
mentionnées en lien avec les pucerons, les détritivores et les
herbivores. On retrouve ici un thème important de la MA2.
soil: “anecic”, “respiration”, “american”. Les
vers de terres anéciques sont une classe de vers de terre définie par M.
B. Bouché (Stratégie lombricienne, 1977), dont l’une des
caractéristiques principales était de creuser de profondes galeries dans
le sol (1 à 6 mètres de profondeur). On peut donc penser qu’ils
participent très fortement à la respiration des sols,
probablement plus que les deux autres classes (épigés et endogés), qui,
par définition, creusent moins profondément. La présence du mot
“american” sous-entends que les vers de terre anéciques sont
particulièrement surveillées en Amérique. On retrouve ici un terme
important de la MA1 (la racine “pool” n’apparaît que dans la MA1 dans la
mesure de la fréquence des mots).
word_cors_ecology2= word_cors %>%
filter(item1 %in% c("ecosystem","invasion","interrelationship")) %>%
group_by(item1) %>%
slice_max(correlation, n = 5) %>% # the plot don't know how to manage the ex-aequo during classifying.
ungroup() %>%
mutate(item2 = reorder(item2, correlation)) %>%
ggplot(aes(item2, correlation)) +
geom_bar(stat = "identity") +
facet_wrap(~ item1, scales = "free") +
coord_flip()
word_cors_ecology2
Le calcul des corrélations à l’intérieur de groupes de cinq lignes
montre les termes fréquement employés au voisinage des mots choisis pour
cette seconde partie d’analyse
(ecosystem/interrelationship/invasion).
ecosystem: “engineers”,“lumbricus”,
“understanding”, “indigenous”. La présence du “engineer” à
proximité de “ecosytem” et de “lumbricus” laisse entendre que les textes
composant le corpus désignent souvent le vers de terre comme un agent
majeur des écosystèmes. Le terme “understanding” laisse entendre que la
question est complexes et que les recherches sur le sujet sont encore en
cours. “indigenous” évoque l’idée d’une espèce introduite, qui est donc
“indigène” pour son écosystème d’acceuil.
interrelationship: “polluted”, “pb”, “metals”,
“harvest”, “cycles”. La présence de ces termes dans le voisinage du
mots “interrelations” montre que le corpus parle sans doute de la
pollution des sols aux métaux lourd (comme le plomb), et plus largement
du monde l’agriculture, de l’agronomie et des récoltes. On retrouve ici
un thème abordé dans la MA4.
invasion:
“forest”, “usa”, “earthworm”, “northern”. On peut en déduire
que dans les textes du corpus, les vers de terre sont souvent liés à des
invasions dans les forêts du nord des USA. On retrouve
ici un thème important de la MA3.
word_cors_geo= word_cors %>%
filter(item1 %in% c("european","american","usa")) %>%
group_by(item1) %>%
slice_max(correlation, n = 5) %>% # the plot don't know how to manage the ex-aequo during classifying.
ungroup() %>%
mutate(item2 = reorder(item2, correlation)) %>%
ggplot(aes(item2, correlation)) +
geom_bar(stat = "identity") +
facet_wrap(~ item1, scales = "free") +
coord_flip()
word_cors_geo
Le calcul des corrélations à l’intérieur de groupes de cinq
lignes montre les termes fréquement employés au voisinage des mots
choisis pour cette troisième partie d’analyse. Les mots ont été choisis
spécifiquement pour tenter de grouper les données selon la région
géographique.
En regardant les encadrés “american” et “usa” (les USA
étant un pays d’Amérique), on peut remarquer la présence des termes
“previously”, “uninvaded”, “invasion” et “forests”. Ce
corpus semble donc décrire un processus d’invasion dynamique
(“previously uninvaded”), même s’il est plutôt étonnant que ces deux
mots ne se trouvent pas dans le même subplot. L’encadré “european” nous
apprend que ce mot est souvent utilié à proximité de “north”“
et “america”, ce qui laisse entendre que les vers de terre
invasifs actifs en Amérique sont majoritairement européens.
Dans les analyses précédentes, on a vu que:
- MA1/MA3: Métaanalyses globalement défavorables aux
vers de terre. Si certains bénéfices, pour la santé des sols notamment,
semblent être reconnus, le vers de terre est perçu comme une espèce
invasive perturbant les écosystèmes natifs. Les mots “soil”, “forest” et
“effect” (MA1) et “canopy” (MA3), donnent une idée des environnements où
se sont déroulées les études (sols forestiers, forêt). Les mots “exotic”
(MA1) et “eastern” (MA3) semblent montrer que les espèces invasives
viennent probablement d’Europe ou d’Asie. Les bigrammes “forest soils”
(MA1) et “tree species” (MA3) confirment que les études s’intéressent
aux environnements forestiers. Les bigrammes “earthworm invasion” (MA1)
et “earthworm invasions” (MA3) confirment que les vers de terre
asiatiques et européens sont perçus comme des espèces invasives. La MA1
étant plus négative que prévu, sachant que la MA3 (plus positive que
prévu) ne semble pas compenser totalement cet effet (cf. “words preceded
by not”), on en déduit que ces deux métaanalyses sont un peu plus
négatives que présenté précedemment, en raison de l’effet du mot “not”
sur le mot suivant. Grâce au calcul des corrélations pour la MA3, il est
maintenant possible d’affirmer que les territoires envahis sont
principalement le nord des USA.
- MA2/MA4: Métaanalyses globalement favorables au vers
de terre, mettant en avant les bienfaits physiologiques des vers de
terre pour la plante et les avantages de ces interactions pour favoriser
la productivité. Cependant, le vers de terre peut malgré tout rester
nuisible, car c’est une espèce invasive qui risque de déséquilibrer
l’écosystème natif. La MA2 semble plus se focaliser sur les effets
observées sur les plantes en tant que telles (pucerons, harbivores)
alors que la 4 semble davantage axée sur la pollution des sols, notament
par les métaux lourds (Cu, Pb). Le bigramme “soil organisms” est le plus
représenté dans les deux métaanalyses, reforçant encore le lien
thématique (écologie des sols) commun aux MA2 et 4. Par ailleurs, de
nombreuses références aux plantes (“plant responses”, “plant mediated”
et “root herbivore” pour la MA2 et “plant functionnal”, “dry weight” et
“diplocardia spp” pour la MA4) montrent que les deux MA s’intéressent
spécifiquement au rôle des plantes dans l’écologie des sols. La MA2 et
la MA4 sont plus positive que prévu (cf. “words preceded by not”), en
raison de l’effet du mot “not” sur le mot suivant.
Grâce au calcul des corrélations sur les groupes de 5 lignes, on peut maintenant rajouter que:
MA1/MA3: Métaanalyses globalement défavorables aux vers de terre. Si certains bénéfices, pour la santé des sols notamment, semblent être reconnus, le vers de terre est perçu comme une espèce invasive perturbant les écosystèmes natifs.
Les mots “soil”, “forest” et “effect” (MA1) et “canopy” (MA3), donnent une idée des environnements où se sont déroulées les études (sols forestiers, forêt). Les mots “exotic” (MA1) et “eastern” (MA3) semblent montrer que les espèces invasives viennent majoritairement d’Europe (voir “Corrélations: origine géographique”).
Les bigrammes “forest soils” (MA1) et “tree species” (MA3) confirment que les études s’intéressent aux environnements forestiers. Les bigrammes “earthworm invasion” (MA1) et “earthworm invasions” (MA3) confirment que les vers de terre asiatiques et européens sont perçus comme des espèces invasives.
La MA1 et la MA3 sont moins positives que prévu (cf. “words preceded by not”), en raison de l’effet du mot “not” sur le mot suivant.
MA2/MA4: Métaanalyses globalement favorables au vers de terre, mettant en avant les bienfaits physiologiques des vers de terre pour la plante et les avantages de ces interactions pour favoriser la productivité. Cependant, le vers de terre peut malgré tout rester nuisible, car c’est une espèce invasive qui risque de déséquilibrer l’écosystème natif.
La MA2 semble plus se focaliser sur les effets observées sur les plantes en tant que telles (pucerons, harbivores) alors que la 4 semble davantage axée sur la pollution des sols, notamment par les métaux lourds (Cu, Pb). Les analyses de la partie “Corrélations: écologie” confirment que certains articles du corpus étudient bel et bien les relations entre les récoltes, les cycles naturels, et la pollution aux métaux lourds (principalement Pb).
Le bigramme “soil organisms” est le plus représenté dans les deux métaanalyses, reforçant encore le lien thématique (écologie des sols) commun aux MA2 et 4. Par ailleurs, de nombreuses références aux plantes (“plant responses”, “plant mediated” et “root herbivore” pour la MA2 et “plant functionnal”, “dry weight” et “diplocardia spp” pour la MA4) montrent que les deux MA s’intéressent spécifiquement au rôle des plantes dans l’écologie des sols.
La MA2 et la MA4 sont plus positive que prévu (cf. “words preceded by not”), en raison de l’effet du mot “not” sur le mot suivant.
library(dplyr)
library(ggraph)
set.seed(2016)
word_cors %>%
filter(item1 %in% c("earthworm")) %>%
head(100) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), repel = TRUE) +
theme_void()
library(dplyr)
library(ggraph)
set.seed(2016)
word_cors %>%
filter(item1 %in% c("european")) %>%
head(50) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), repel = TRUE) +
theme_void()
library(dplyr)
library(ggraph)
set.seed(2016)
word_cors %>%
filter(item1 %in% c("american")) %>%
head(100) %>%
graph_from_data_frame() %>%
ggraph(layout = "fr") +
geom_edge_link(aes(edge_alpha = correlation), show.legend = FALSE) +
geom_node_point(color = "lightblue", size = 5) +
geom_node_text(aes(label = name), repel = TRUE) +
theme_void()